NO.46 全排列 中等
思路一:深度优先遍历,回溯法 看到全排列,就想到DFS构建树。重点是每条分支路径上每个数组元素只能使用一次。可以使用一个nums.length长度的boolean类型的数组标志每个元素的使用情况,false未使用,true已使用。
递归前先检查当前元素是否被使用过,如果使用过就剪枝;如果未使用过就将当前元素加入集合并将对应的标志设置为true。
每次回溯的时候不仅要将最后加入集合的元素移除,还要将被移除元素对应的标志置为false。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| List<List<Integer>> res=new ArrayList<>(); int[] nums; public List<List<Integer>> permute(int[] nums) { if (nums==null||nums.length==0)return res; this.nums=nums; boolean[] flag=new boolean[nums.length]; dfs(new LinkedList<Integer>(),flag); return res; }
private void dfs(LinkedList<Integer> combination,boolean[] flag) { if (combination.size()==nums.length){ res.add(new ArrayList<>(combination)); return; } for (int i=0;i<nums.length;i++){ if (!flag[i]){ combination.add(nums[i]); flag[i]=!flag[i]; dfs(combination,flag); flag[i]=!flag[i]; combination.removeLast(); } } }
|
时间复杂度:O(N*N!)
本人菜鸟,有错误请告知,感激不尽!
更多题解和学习记录博客:博客、github